package com.ruoyi.common;

/**
 * @author zhouwenhao
 * @date 2024/10/29
 * @dec 描述
 */
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @author xuan
 * @since 2020-08-21
 * 读取mdb文件
 */
public class MdbUtils {

    /**
     *
     * @param mdbPath mdb文件路径
     * @param mdbSql mdb执行sql
     * @param mdbColumnList mdb查询字段
     * @return
     * @throws Exception
     */
    public static List<Map<String, Object>> resolverMdb(String mdbPath, String mdbSql, List<String> mdbColumnList) throws Exception {
        if (mdbPath.isEmpty() || mdbSql.isEmpty() || mdbColumnList.isEmpty()) {
            throw new Exception("mdb文件路径不能为空、SQL语句不能为空或者返回字段列表不能为空");
        }
        List<Map<String, Object>> mdbEntityList = new ArrayList<>();
        Properties prop = new Properties();
        // 设置编码（通常不需要为Ucanaccess设置字符集，因为它会自动处理）
        // prop.put("charSet", "UTF-8"); // 这行可以注释掉或删除
        String dbUrl = "jdbc:ucanaccess://" + mdbPath;
        // 引入驱动（在Java 9及以上版本中，使用newInstance()可能会引发警告或错误，建议使用Class.forName()的默认构造函数）
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); // 这通常只需要在类路径中正确包含驱动时执行一次，但在这里放着也无妨
        try (Connection conn = DriverManager.getConnection(dbUrl);
             Statement statement = conn.createStatement();
             ResultSet result = statement.executeQuery(mdbSql)) {

            while (result.next()) {
                // 在每次迭代时创建一个新的Map对象
                Map<String, Object> mdbMapList = new HashMap<>(mdbColumnList.size());
                for (String col : mdbColumnList) {
                    mdbMapList.put(col, result.getObject(col));
                }
                mdbEntityList.add(mdbMapList);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("处理MDB文件时出错", e); // 重新抛出异常，以便调用者可以处理它
        }
        // 返回数据
        return mdbEntityList;
    }
    public static void pollDatabase() throws Exception {
        String mdbPath = "C:/Users/pengjie/Desktop/RealData.mdb";
        String mdbSql = "SELECT * FROM DiMianFenZhan WHERE AutoID=(SELECT MAX(AutoID) FROM DiMianFenZhan)";
        List<String> mdbList = Arrays.asList("AutoID", "Code", "Name", "Address");

        // 假设 MdbUtils 是你项目中定义的类，用于解析 MDB 文件并执行 SQL 查询
        List<Map<String, Object>> list = MdbUtils.resolverMdb(mdbPath, mdbSql, mdbList);

        // 打印查询结果
        for (Map<String, Object> row : list) {
            System.out.println(row);
        }

        // 注意：如果 MdbUtils.resolverMdb 方法关闭了数据库连接，则下面的代码不需要处理连接关闭。
        // 如果它没有关闭连接，你可能需要在适当的位置添加关闭连接的代码。
    }
//    public static void main(String[] args) throws Exception {
//        Timer timer = new Timer();
//        TimerTask task = new TimerTask() {
//            @Override
//            public void run() {
//                try {
//                    pollDatabase();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        };
//        // 安排任务每两分钟执行一次（120000 毫秒）
//        timer.scheduleAtFixedRate(task, 0, 120000);
//    }
}
